// https://www.acwing.com/problem/content/848/

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 100010;
vector<int> g[N];  // 存储树的邻接表
int n, subtree[N], ans = N;

void dfs(int u, int parent) {
    subtree[u] = 1;  // 当前子树大小
    int max_part = 0;  // 记录移除当前点后的最大连通块

    for (int v : g[u]) {
        if (v == parent) {
            continue;  // 避免回溯到父节点
        }
        dfs(v, u);
        subtree[u] += subtree[v];
        max_part = max(max_part, subtree[v]);  // 记录子树的最大部分
    }

    max_part = max(max_part, n - subtree[u]);  // 计算删除 u 后，剩余部分的大小
    ans = min(ans, max_part);  // 取最小的 max_part 作为重心的衡量标准
}

int main() {
    scanf("%d", &n);
    int a, b;
    for (int i = 1; i < n; i++) {
        scanf("%d%d", &a, &b);
        g[a].push_back(b);
        g[b].push_back(a);
    }

    dfs(1, -1);
    cout << ans << endl;
    return 0;
}
